/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 26727
 * Date: 2024-03-27
 * Time: 21:33
 */
class Solution {
    //优化后 虚拟结点 初始值为0 取最小再加当前值
    //该题为多状态表达,需要分析清楚
    public int minCost(int[][] costs) {
        int n = costs.length;
        //1.dp表示dp[i][0]表示粉刷到i位置，最后一个位置粉刷为红色此时的最小花费
        int[][] dp = new int[n+1][3];
        //2.初始化
        // dp[0][0] = costs[0][0]; dp[0][1] = costs[0][1]; dp[0][2] = costs[0][2];
        //3.填表顺序 从左往右 同时
        for(int i = 1; i <= n; i++) {
            dp[i][0] = Math.min(dp[i-1][1],dp[i-1][2])+costs[i-1][0];
            dp[i][1] = Math.min(dp[i-1][0],dp[i-1][2])+costs[i-1][1];
            dp[i][2] = Math.min(dp[i-1][1],dp[i-1][0])+costs[i-1][2];
        }
        //5.返回结果
        return  Math.min(dp[n][2],Math.min(dp[n][0],dp[n][1]));
    }
}
